package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.PercepcionDAO;
import mx.ipn.persistencia.dao.TipoPercepcionDescuentoDAO;
import mx.ipn.to.PercepcionTO;

public class PercepcionDAOMySQL implements PercepcionDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(PercepcionDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO percepcion(nombre,descripcion,valor,id_tipo_percepcion_descuento) VALUES(?,?,?,?)";
	private static final String UPDATE = "UPDATE percepcion SET nombre=?,descripcion=?,valor=?,id_tipo_percepcion_descuento=? WHERE id_percepcion=?";
	private static final String FINDBYID = "SELECT * FROM percepcion WHERE id_percepcion=?";
	private static final String FINDBYNOMBRETIPOPD = "SELECT * FROM percepcion WHERE nombre=? and id_tipo_percepcion_descuento=?";
	private static final String SELECT = "SELECT * FROM percepcion";
	private static final String SELECTBYTIPOPD = "SELECT * FROM percepcion WHERE id_tipo_percepcion_descuento=?";
	private static final String SELECTBYNOMBRE = "SELECT * FROM percepcion WHERE nombre=?";

	@Override
	public PercepcionTO findPercepcionById(int idPercepcion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idPercepcion);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				TipoPercepcionDescuentoDAO tipoPercepcionDescuentoDAO = fabricaMySQL
						.getTipoPercepcionDescuentoDAO();

				PercepcionTO percepcionTO = new PercepcionTO(
						idPercepcion,
						rs.getString("nombre"),
						rs.getString("descripcion"),rs.getDouble("valor"),
						tipoPercepcionDescuentoDAO
								.findTipoPercepcionDescuentoById(rs
										.getInt("id_tipo_percepcion_descuento")));

				ps.close();
				conexion.close();
				return percepcionTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PercepcionTO findPercepcionByNombreTipoPD(String nombre, int idTipoPD) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYNOMBRETIPOPD);

			ps.setString(1, nombre);
			ps.setInt(2, idTipoPD);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				TipoPercepcionDescuentoDAO tipoPercepcionDescuentoDAO = fabricaMySQL
						.getTipoPercepcionDescuentoDAO();

				PercepcionTO percepcionTO = new PercepcionTO(rs
						.getInt("id_percepcion"), rs.getString("nombre"), rs
						.getString("descripcion"),rs.getDouble("valor"), tipoPercepcionDescuentoDAO
						.findTipoPercepcionDescuentoById(rs
								.getInt("id_tipo_percepcion_descuento")));

				ps.close();
				conexion.close();
				return percepcionTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertPercepcion(PercepcionTO percepcionTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, percepcionTO.getNombre());
			ps.setString(2, percepcionTO.getDescripcion());
			ps.setDouble(3, percepcionTO.getValor());
			ps.setInt(4, percepcionTO.getTipoPercepcionDescuentoTO()
					.getIdTipoPercepcionDescuento());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<PercepcionTO> selectPercepcion() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			TipoPercepcionDescuentoDAO tipoPercepcionDescuentoDAO = null;

			ArrayList<PercepcionTO> percepcionTO = null;
			PercepcionTO percepcionTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (percepcionTO == null) {
					percepcionTO = new ArrayList<PercepcionTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoPercepcionDescuentoDAO = fabricaMySQL
							.getTipoPercepcionDescuentoDAO();
				}

				percepcionTO2 = new PercepcionTO(
						rs.getInt("id_percepcion"),
						rs.getString("nombre"),
						rs.getString("descripcion"),rs.getDouble("valor"),
						tipoPercepcionDescuentoDAO
								.findTipoPercepcionDescuentoById(rs
										.getInt("id_tipo_percepcion_descuento")));

				percepcionTO.add(percepcionTO2);
			}
			ps.close();
			conexion.close();
			return percepcionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<PercepcionTO> selectPercepcionByNombre(String nombre) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			TipoPercepcionDescuentoDAO tipoPercepcionDescuentoDAO = null;

			ArrayList<PercepcionTO> percepcionTO = null;
			PercepcionTO percepcionTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYNOMBRE);
			ps.setString(1, nombre);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (percepcionTO == null) {
					percepcionTO = new ArrayList<PercepcionTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoPercepcionDescuentoDAO = fabricaMySQL
							.getTipoPercepcionDescuentoDAO();
				}

				percepcionTO2 = new PercepcionTO(
						rs.getInt("id_percepcion"),
						rs.getString("nombre"),
						rs.getString("descripcion"),rs.getDouble("valor"),
						tipoPercepcionDescuentoDAO
								.findTipoPercepcionDescuentoById(rs
										.getInt("id_tipo_percepcion_descuento")));

				percepcionTO.add(percepcionTO2);
			}
			ps.close();
			conexion.close();
			return percepcionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PercepcionTO selectPercepcionByTipoPD(int idTipoPD) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			TipoPercepcionDescuentoDAO tipoPercepcionDescuentoDAO = null;

			ArrayList<Integer> listIdPercepcion = null;
			ArrayList<String> listNombre = null;
			ArrayList<String> listDescripcion = null;

			PercepcionTO percepcionTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYTIPOPD);
			ps.setInt(1, idTipoPD);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdPercepcion == null) {

					listIdPercepcion = new ArrayList<Integer>();
					listNombre = new ArrayList<String>();
					listDescripcion = new ArrayList<String>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoPercepcionDescuentoDAO = fabricaMySQL
							.getTipoPercepcionDescuentoDAO();
				}

				listIdPercepcion.add(rs.getInt("id_percepcion"));
				listNombre.add(rs.getString("nombre"));
				listDescripcion.add(rs.getString("descripcion"));

			}
			if (listIdPercepcion != null) {
				
				Integer[] arrIdPercepcion = (Integer[])listIdPercepcion.toArray(new Integer[listIdPercepcion.size()]);
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				String[] arrDescripcion = (String[])listDescripcion.toArray(new String[listDescripcion.size()]);
				
				percepcionTO = new PercepcionTO(arrIdPercepcion, arrNombre,
						arrDescripcion, tipoPercepcionDescuentoDAO
								.findTipoPercepcionDescuentoById(idTipoPD));
			}
			ps.close();
			conexion.close();
			return percepcionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updatePercepcion(PercepcionTO percepcionTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setString(1, percepcionTO.getNombre());
			ps.setString(2, percepcionTO.getDescripcion());
			ps.setDouble(3, percepcionTO.getValor());
			ps.setInt(4, percepcionTO.getTipoPercepcionDescuentoTO()
					.getIdTipoPercepcionDescuento());
			ps.setInt(5, percepcionTO.getIdPercepcion());

			
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
